package com.fkc.javahansoulbms.util;

import lombok.Data;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

// 该类返回统一的结果
// @Data 是 lombok，省去了 get 和 set 方法
@Data
public class Result {
	private Boolean success;    // 是否成功
	private Integer code;       // 返回状态码
	private String message;     // 返回消息
	private Map<String, Object> data = new ConcurrentHashMap<>();   // 返回数据
	
	// 把构造器私有
	private Result () {
	}
	
	/**
	 * 返回成功的结果
	 * @return 返回成功的结果对象
	 */
	public static Result ok () {
		Result result = new Result();
		result.setSuccess(true);
		result.setCode(ResultCode.SUCCESS);
		result.setMessage("成功");
		
		return result;
	}
	
	/**
	 * 返回失败的结果
	 * @return 返回失败的结果对象
	 */
	public static Result error () {
		Result result = new Result();
		result.setSuccess(false);
		result.setCode(ResultCode.ERROR);
		result.setMessage("失败");
		
		return result;
	}
	
	/**
	 * 设置是否成功
	 * @param success 是否成功
	 * @return 当前结果对象
	 */
	public Result success (Boolean success) {
		this.setSuccess(success);
		
		return this;
	}
	
	/**
	 * 设置消息
	 * @param message 消息
	 * @return 当前结果对象
	 */
	public Result message (String message) {
		this.setMessage(message);
		
		return this;
	}
	
	/**
	 * 设置状态码
	 * @param code 状态码
	 * @return 当前结果对象
	 */
	public Result code (Integer code) {
		this.setCode(code);
		
		return this;
	}
	
	/**
	 * 添加数据
	 * @param key 键
	 * @param value 值
	 * @return 当前结果对象
	 */
	public Result data (String key, Object value) {
		this.data.put(key, value);
		
		return this;
	}
	
	/**
	 * 设置数据
	 * @param map 数据
	 * @return 当前结果对象
	 */
	public Result data (Map<String, Object> map) {
		this.setData(map);
		
		return this;
	}
}
